﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Atechnology.glassCAD.Shapes.CutViewer
{
    public class CodrBuilder
    {
        private List<CodrPosition> positions;

        public CodrBuilder()
        {
            positions = new List<CodrPosition>();
        }

        /// <summary>
        /// Добавление позиции на гнутьё.
        /// </summary>
        /// <param name="l">Параметр L стекла (ширина окна, для которого делается рамка).</param>
        /// <param name="h">Параметр H стекла (высота окна, для которого делается рамка).</param>
        /// <param name="depth">Глубина рамки (расстояние между стёклами, между которыми находится рамка).</param>
        /// <param name="thickness">Толщина рамки.</param>
        /// <param name="count">Количество рамок с заданными параметрами, которые нужно выгнуть.</param>
        public void AddSpacer(int l, int h, int depth, int thickness, int count)
        {
            positions.Add(new CodrPosition(l, h, depth, thickness, count));
        }

        public void BuildCodr(string fileName)
        {
            Stream stream = File.Open(fileName, FileMode.Create);
            this.BuildCodr(stream);
            stream.Close();
        }

        public void BuildCodr(Stream stream)
        {
            StreamWriter writer = new StreamWriter(stream);
            string codr = "                                                                                                    (";
            for (int i = 0; i < positions.Count; i++)
                codr += "P" + (i + 1).ToString() + "L" + (positions[i].L - positions[i].Thickness).ToString() + "H" + (positions[i].H - positions[i].Thickness).ToString() + "R" + positions[i].Depth.ToString() + "S" + positions[i].Count.ToString();
            codr += ")                                                                                                    E";
            int maxLength = 0;

            string result = "";
            StringBuilder resultBuilder = new StringBuilder(result);
            for (int symbolIter = 0; symbolIter < codr.Length; symbolIter++)
            {
                maxLength++;
                if (maxLength == 201)
                {
                    resultBuilder.Append("\r\n");
                    maxLength = 0;
                }
                resultBuilder.Append(codr[symbolIter]);
            }
            for (int symbolIter = 0; symbolIter < 199 - maxLength; symbolIter++)
                resultBuilder.Append(" ");
            resultBuilder.Append("\r\n");
            writer.Write(resultBuilder.ToString());
            writer.Close();
        }

        class CodrPosition
        {
            private int l;
            public int L
            {
                get { return l; }
                set { l = value; }
            }
            private int h;
            public int H
            {
                get { return h; }
                set { h = value; }
            }
                        
            private int depth;
            public int Depth
            {
                get { return depth; }
                set { depth = value; }
            }
            private int thickness;
            public int Thickness
            {
                get { return thickness; }
                set { thickness = value; }
            }
            private int count;
            public int Count
            {
                get { return count; }
                set { count = value; }
            }

            public CodrPosition(int l, int h, int depth, int thickness, int count)
            {
                this.l = l;
                this.h = h;
                this.depth = depth;
                this.thickness = thickness;
                this.count = count;
            }
        }
    }
}
